home *** CD-ROM | disk | FTP | other *** search
- /*
- * Example of server using UDP protocol.
- */
-
- #include "inet.h"
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int tfd;
- struct sockaddr_in serv_addr;
- struct t_bind req;
-
- pname = argv[0];
-
- /*
- * Open a UDP endpoint.
- */
-
- if ( (tfd = t_open(DEV_UDP, O_RDWR, (struct t_info *) 0)) < 0)
- err_dump("server: can't t_open %s", DEV_UDP);
-
- /*
- * Bind our local address so that the client can send to us.
- */
-
- bzero((char *) &serv_addr, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- serv_addr.sin_port = htons(SERV_UDP_PORT);
-
- req.addr.maxlen = sizeof(serv_addr);
- req.addr.len = sizeof(serv_addr);
- req.addr.buf = (char *) &serv_addr;
- req.qlen = 5;
-
- if (t_bind(tfd, &req, (struct t_bind *) 0) < 0)
- err_dump("server: can't t_bind local address");
-
- echo(tfd); /* do it all */
- /* NOTREACHED */
- }
-
- /*
- * Read the contents of the socket and write each line back to
- * the sender.
- */
-
- echo(tfd)
- int tfd;
- {
- int n, flags;
- char line[MAXLINE];
- char *t_alloc();
- struct t_unitdata *udataptr;
-
- /*
- * Allocate memory for the t_unitdata structure and the address field
- * in that structure. This allows any size of address to be handled
- * by this function.
- */
-
- udataptr = (struct t_unitdata *) t_alloc(tfd, T_UNITDATA, T_ADDR);
- if (udataptr == NULL)
- err_dump("server: t_alloc error for T_UNITDATA");
-
- for ( ; ; ) {
- /*
- * Read a message from the socket and send it back
- * to whomever sent it.
- */
-
- udataptr->opt.maxlen = 0; /* don't care about options */
- udataptr->opt.len = 0;
- udataptr->udata.maxlen = MAXLINE;
- udataptr->udata.len = MAXLINE;
- udataptr->udata.buf = line;
- if (t_rcvudata(tfd, udataptr, &flags) < 0)
- err_dump("server: t_rcvudata error");
-
- if (t_sndudata(tfd, udataptr) < 0)
- err_dump("server: t_sndudata error");
- }
- }
-